package gormplus

import (
	"github.com/hlhutu/gormplus/utils"
	"gorm.io/gorm"
	"gorm.io/gorm/schema"
	"reflect"
	"strings"
)

// Model 一些通用增删改查
type Model[T schema.Tabler] struct {
	primaryKeys []string // 主键字段
	tableName   string
	gormDB      *gorm.DB // gorm的连接
}

// NewModel 构造函数
func NewModel[T schema.Tabler](t T, g *gorm.DB) Model[T] {
	m := Model[T]{
		primaryKeys: make([]string, 0),
		tableName:   t.TableName(),
		gormDB:      g,
	}
	// 识别model中的主键
	utils.Reflect().EachStruct(t, func(f reflect.StructField, t reflect.Type, value reflect.Value) bool {
		// 获取gorm标签
		gormTag := f.Tag.Get("gorm")
		if gormTag != "" && strings.Contains(gormTag, "primaryKey") {
			fieldName := getTagValue(gormTag, "column")
			if fieldName == "" { // 获取不到就用原本的名字
				fieldName = f.Name
			}
			m.primaryKeys = append(m.primaryKeys, fieldName)
		}
		return true
	})
	return m
}

// Page 分页对象
type Page struct {
	Total    int64 `json:"total"`    // 总条数
	PageNum  int   `json:"pageNum"`  // 当前页码
	PageSize int   `json:"pageSize"` // 每页大小
}
